#ifndef COPTIONAL_H
#define COPTIONAL_H

#include <stddef.h>

#ifdef __cplusplus
extern "C" {
#endif

// 可选值类型ID（内置类型+自定义类型）
typedef enum {
    COPTIONAL_NONE = 0,    // 无值
    COPTIONAL_INT,         // 整数
    COPTIONAL_FLOAT,       // 单精度浮点数
    COPTIONAL_DOUBLE,      // 双精度浮点数
    COPTIONAL_STR,         // 字符串
    COPTIONAL_CUSTOM_BASE  // 自定义类型起始ID
} COptionalType;

// 不透明结构体（隐藏实现）
typedef struct COptional COptional;

// 1. 核心管理函数
COptional* coptional_create(void);
void coptional_destroy(COptional* opt);

// 2. 清除值（恢复为无值状态）
void coptional_clear(COptional* opt);

// 3. 自定义类型注册（返回类型ID）
//  - size: 类型大小
//  - copy: 复制函数（src -> dest）
//  - destroy: 销毁函数（释放内部资源）
COptionalType coptional_register_custom_type(
    size_t size,
    void (*copy)(const void* src, void* dest),
    void (*destroy)(void* data)
);

// 4. 设置值（内置类型）
void coptional_set_int(COptional* opt, int value);
void coptional_set_float(COptional* opt, float value);
void coptional_set_double(COptional* opt, double value);
void coptional_set_str(COptional* opt, const char* value);

// 5. 设置值（自定义类型）
int coptional_set_custom(COptional* opt, COptionalType type_id, const void* data);

// 6. 检查是否有值
int coptional_has_value(const COptional* opt);

// 7. 获取值类型
COptionalType coptional_get_type(const COptional* opt);

// 8. 获取值（内置类型，无值时返回默认值）
int coptional_get_int(const COptional* opt, int default_val);
float coptional_get_float(const COptional* opt, float default_val);
double coptional_get_double(const COptional* opt, double default_val);
const char* coptional_get_str(const COptional* opt, const char* default_val);

// 9. 获取值（自定义类型）
//  - dest: 接收数据的缓冲区（需提前分配）
int coptional_get_custom(const COptional* opt, void* dest);

#ifdef __cplusplus
}
#endif

#endif // COPTIONAL_H